--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
android/app/src/main/java/com/meshchatx/WavPcmAttachmentRecorder.java 6e10b7c45787d0be4c4a9e17622aeb5f4a888287 (6e10b7c4) Text, 6.07 KB
Tff7b72package T7ee787com.meshchatxTb4b4b4;
Tff7b72import T7ee787android.ManifestTb4b4b4;
Tff7b72import T7ee787android.content.ContextTb4b4b4;
Tff7b72import T7ee787android.content.pm.PackageManagerTb4b4b4;
Tff7b72import T7ee787android.media.AudioFormatTb4b4b4;
Tff7b72import T7ee787android.media.AudioRecordTb4b4b4;
Tff7b72import T7ee787android.media.MediaRecorderTb4b4b4;
Tff7b72import T7ee787android.util.Base64Tb4b4b4;
Tff7b72import T7ee787androidx.annotation.NullableTb4b4b4;
Tff7b72import T7ee787androidx.core.content.ContextCompatTb4b4b4;
Tff7b72import T7ee787java.io.ByteArrayOutputStreamTb4b4b4;
Tff7b72import T7ee787java.nio.ByteBufferTb4b4b4;
Tff7b72import T7ee787java.nio.ByteOrderTb4b4b4;
T8b949e/**
* 16-bit mono PCM at 48kHz, packaged as RIFF WAV. Capped in duration to keep memory use bounded.
*/
Tff7b72public Tff7b72final Tff7b72class T56d364WavPcmAttachmentRecorder Tb4b4b4{
Tff7b72public Tff7b72static Tff7b72final Tffa657int Te6edf3SAMPLE_RATE Tff7b72= T79c0ff48000Tb4b4b4;
Tff7b72public Tff7b72static Tff7b72final Tffa657int Te6edf3MAX_DURATION_MS Tff7b72= T79c0ff120_000Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3CHANNEL Tff7b72= Te6edf3AudioFormatTb4b4b4.Te6edf3CHANNEL_IN_MONOTb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3ENCODING Tff7b72= Te6edf3AudioFormatTb4b4b4.Te6edf3ENCODING_PCM_16BITTb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3MAX_RAW_PCM Tff7b72= Te6edf3SAMPLE_RATE Tff7b72* T79c0ff2 Tff7b72* Tb4b4b4(Te6edf3MAX_DURATION_MS Tff7b72/ T79c0ff1000Tb4b4b4)Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3IO_BYTES Tff7b72= T79c0ff4096Tb4b4b4;
Tff7b72private Tff7b72final Te6edf3Context Te6edf3ctxTb4b4b4;
Tff7b72private Tff7b72final Te6edf3javaTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3concurrentTb4b4b4.Te6edf3atomicTb4b4b4.Te6edf3AtomicBoolean Te6edf3rec Tff7b72= Tff7b72new Te6edf3javaTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3concurrentTb4b4b4.Te6edf3atomicTb4b4b4.Te6edf3AtomicBooleanTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tf0883e@Nullable
Tff7b72private Te6edf3AudioRecord Te6edf3audioRecordTb4b4b4;
Tf0883e@Nullable
Tff7b72private Te6edf3Thread Te6edf3threadTb4b4b4;
Tff7b72private Tff7b72final Te6edf3ByteArrayOutputStream Te6edf3pcm Tff7b72= Tff7b72new Te6edf3ByteArrayOutputStreamTb4b4b4(T79c0ff65536Tb4b4b4)Tb4b4b4;
Tff7b72public Td2a8ffWavPcmAttachmentRecorderTb4b4b4(Te6edf3Context Te6edf3ctxTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3ctx Tff7b72= Te6edf3ctxTb4b4b4.Te6edf3getApplicationContextTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffcanStartTb4b4b4(Te6edf3Context Te6edf3cTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ContextCompatTb4b4b4.Te6edf3checkSelfPermissionTb4b4b4(Te6edf3cTb4b4b4, Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3RECORD_AUDIOTb4b4b4) Tff7b72!Tff7b72= Te6edf3PackageManagerTb4b4b4.Te6edf3PERMISSION_GRANTEDTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3AudioRecordTb4b4b4.Te6edf3getMinBufferSizeTb4b4b4(Te6edf3SAMPLE_RATETb4b4b4, Te6edf3CHANNELTb4b4b4, Te6edf3ENCODINGTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72public Te6edf3String Td2a8ffstartTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3recTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"Ta5d6fferr: already recordingTa5d6ff"Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3ContextCompatTb4b4b4.Te6edf3checkSelfPermissionTb4b4b4(Te6edf3ctxTb4b4b4, Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3RECORD_AUDIOTb4b4b4) Tff7b72!Tff7b72= Te6edf3PackageManagerTb4b4b4.Te6edf3PERMISSION_GRANTEDTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"Ta5d6fferr: record_audioTa5d6ff"Tb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3min Tff7b72= Te6edf3AudioRecordTb4b4b4.Te6edf3getMinBufferSizeTb4b4b4(Te6edf3SAMPLE_RATETb4b4b4, Te6edf3CHANNELTb4b4b4, Te6edf3ENCODINGTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3min Tff7b72<Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"Ta5d6fferr: bufferTa5d6ff"Tb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Te6edf3audioRecord Tff7b72= Tff7b72new Te6edf3AudioRecordTb4b4b4(
Te6edf3MediaRecorderTb4b4b4.Te6edf3AudioSourceTb4b4b4.Te6edf3MICTb4b4b4,
Te6edf3SAMPLE_RATETb4b4b4,
Te6edf3CHANNELTb4b4b4,
Te6edf3ENCODINGTb4b4b4,
Te6edf3min Tff7b72* T79c0ff2
Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3audioRecordTb4b4b4.Te6edf3getStateTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Te6edf3AudioRecordTb4b4b4.Te6edf3STATE_INITIALIZEDTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"Ta5d6fferr: stateTa5d6ff"Tb4b4b4;
Tb4b4b4}
Te6edf3pcmTb4b4b4.Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3recTb4b4b4.Te6edf3setTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3thread Tff7b72= Tff7b72new Te6edf3ThreadTb4b4b4(
Tff7b72thisTb4b4b4:Tb4b4b4:Te6edf3pumpTb4b4b4,
Ta5d6ff"Ta5d6ffmeshchatx-attach-pcmTa5d6ff"
Tb4b4b4)Tb4b4b4;
Te6edf3audioRecordTb4b4b4.Te6edf3startRecordingTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3threadTb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3stopInternalTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Tff7b72null Tff7b72? Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4) Tb4b4b4: Ta5d6ff"Ta5d6fferr: startTa5d6ff"Tb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffpumpTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657byteTff7b72[Tff7b72] Te6edf3buf Tff7b72= Tff7b72new Tffa657byteTff7b72[Te6edf3IO_BYTESTff7b72]Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3recTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3audioRecord Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3nTb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3n Tff7b72= Te6edf3audioRecordTb4b4b4.Te6edf3readTb4b4b4(Te6edf3bufTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3bufTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72<Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pcmTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3n Tff7b72> Te6edf3MAX_RAW_PCMTb4b4b4) Tb4b4b4{
Te6edf3recTb4b4b4.Te6edf3setTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Te6edf3pcmTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3bufTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3nTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Nullable
Tff7b72public Te6edf3String Td2a8ffstopBase64WavTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3recTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3thread Tff7b72=Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3audioRecord Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Te6edf3recTb4b4b4.Te6edf3setTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3thread Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3threadTb4b4b4.Te6edf3joinTb4b4b4(T79c0ff4000LTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3InterruptedException Te6edf3ignoredTb4b4b4) Tb4b4b4{
Tb4b4b4}
Tb4b4b4}
Te6edf3thread Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3audioRecord Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3audioRecordTb4b4b4.Te6edf3getRecordingStateTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3AudioRecordTb4b4b4.Te6edf3RECORDSTATE_RECORDINGTb4b4b4) Tb4b4b4{
Te6edf3audioRecordTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3ignoredTb4b4b4) Tb4b4b4{
Tb4b4b4}
Tff7b72try Tb4b4b4{
Te6edf3audioRecordTb4b4b4.Te6edf3releaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3ignoredTb4b4b4) Tb4b4b4{
Tb4b4b4}
Te6edf3audioRecord Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3rawLen Tff7b72= Te6edf3pcmTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3rawLen Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"Ta5d6ff"Tb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tffa657byteTff7b72[Tff7b72] Te6edf3raw Tff7b72= Te6edf3pcmTb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3Base64Tb4b4b4.Te6edf3encodeToStringTb4b4b4(Te6edf3wrapWavTb4b4b4(Te6edf3rawTb4b4b4, Te6edf3SAMPLE_RATETb4b4b4)Tb4b4b4, Te6edf3Base64Tb4b4b4.Te6edf3NO_WRAPTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3OutOfMemoryError Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3pcmTb4b4b4.Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3ignoredTb4b4b4) Tb4b4b4{
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffstopInternalTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3recTb4b4b4.Te6edf3setTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3audioRecord Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3audioRecordTb4b4b4.Te6edf3releaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3ignoredTb4b4b4) Tb4b4b4{
Tb4b4b4}
Te6edf3audioRecord Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72public Tffa657void Td2a8ffcancelTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3recTb4b4b4.Te6edf3setTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3thread Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3threadTb4b4b4.Te6edf3joinTb4b4b4(T79c0ff2000LTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3InterruptedException Te6edf3ignoredTb4b4b4) Tb4b4b4{
Tb4b4b4}
Tb4b4b4}
Te6edf3thread Tff7b72= Tff7b72nullTb4b4b4;
Te6edf3stopInternalTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3pcmTb4b4b4.Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3ignoredTb4b4b4) Tb4b4b4{
Tb4b4b4}
Tb4b4b4}
Tff7b72public Tffa657boolean Td2a8ffisRunningTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3recTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657byteTff7b72[Tff7b72] Td2a8ffwrapWavTb4b4b4(Tffa657byteTff7b72[Tff7b72] Te6edf3pcmS16Tb4b4b4, Tffa657int Te6edf3rateTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3data Tff7b72= Te6edf3pcmS16Tb4b4b4.Te6edf3lengthTb4b4b4;
Tffa657int Te6edf3rsize Tff7b72= T79c0ff36 Tff7b72+ Te6edf3dataTb4b4b4;
Tffa657int Te6edf3byteRate Tff7b72= Te6edf3rate Tff7b72* T79c0ff2Tb4b4b4;
Te6edf3ByteBuffer Te6edf3bb Tff7b72= Te6edf3ByteBufferTb4b4b4.Te6edf3allocateTb4b4b4(T79c0ff44 Tff7b72+ Te6edf3dataTb4b4b4)Tb4b4b4.Te6edf3orderTb4b4b4(Te6edf3ByteOrderTb4b4b4.Te6edf3LITTLE_ENDIANTb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffRIFFTa5d6ff"Tb4b4b4.Te6edf3getBytesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3rsizeTb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffWAVETa5d6ff"Tb4b4b4.Te6edf3getBytesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6fffmt Ta5d6ff"Tb4b4b4.Te6edf3getBytesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putIntTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putShortTb4b4b4(Tb4b4b4(Tffa657shortTb4b4b4) T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putShortTb4b4b4(Tb4b4b4(Tffa657shortTb4b4b4) T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3rateTb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3byteRateTb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putShortTb4b4b4(Tb4b4b4(Tffa657shortTb4b4b4) T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putShortTb4b4b4(Tb4b4b4(Tffa657shortTb4b4b4) T79c0ff16Tb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4.Te6edf3getBytesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4;
Te6edf3bbTb4b4b4.Te6edf3putTb4b4b4(Te6edf3pcmS16Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3bbTb4b4b4.Te6edf3arrayTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────